#include <iostream>
using namespace std;

const int maxn = 1005;
int d[maxn];           // dp数组，d[i] 表示从 i 出发的最长路径长度
int G[maxn][maxn];     // 邻接矩阵
int n;                 // 节点总数

int dp(int i) {
    if (d[i] != 0) return d[i];  // 已经计算过，直接返回
    d[i] = 1;                    // 初始化为自己（至少包含自己）
    for (int j = 1; j <= n; ++j) {
        if (G[i][j]) {           // 如果存在 i -> j 的边
            d[i] = max(d[i], dp(j) + 1);  // 状态转移
        }
    }
    return d[i];
}
void print_ans(int i)
{
    printf("%d ", i);
    for (int j = 1; j <= n; j++) {
        if (G[i][j] && d[i] == d[j] + 1) {
            print_ans(j);
            break;
        }
    }
}
int main() {
    cin >> n;
    int m;
    cin >> m;

    for (int i = 0; i < m; ++i) {
        int u, v;
        cin >> u >> v;
        G[u][v] = 1;  // 构建图
    }

    fill(d, d + maxn, 0);  // 初始化dp数组为0

    int ans = 0;
    for (int i = 1; i <= n; ++i) {
        ans = max(ans, dp(i));  // 求所有起点的最大值
    }

    cout << "最长路径长度: " << ans << endl;
    return 0;
}